問題解説: 妖精の国 第三のトラブル

問題文

一行は妖精を研究している学者のところへやってきた。長年研究している学者でさえも、妖精についてはまだわからないことが多いらしい。学者が持つ貴重な妖精の文字や、書物に残る記録を見せてもらうことができた。

学者「そうだ、あなた方は凄腕のトラブルシューターと聞きました。是非あなた方にお願いしたいことがあります」

エイト「色々教えてもらったし、もちろん良いわよ!」

妖精のことを話してもらったお礼として、依頼を引き受けることにした。

学者「試しに妖精の国の言葉を使ってサーバのアドレスを設定してみたのですが、アクセスできないんです。DNSサーバに書き込む呪文をどこか間違えたと思うのですが……調べてみてくれませんか」

アクセスできるサーバ

| ServerName | Hostname   | Address       | User  | Password   | Note       |
| ---------- | ---------- | ------------- | ----- | ---------- | ---------- |
| nsd-master | ns1.2.fy   | 192.168.22.53 | admin | ByeByeBind | DNS master |
| nsd-slave  | ns2.2.fy   | 192.168.22.54 | admin | ByeByeBind | DNS slave  |
| cache      | cache.2.fy | 192.168.22.70 | admin | ByeByeBind | DNS cache  |

Webサーバ一覧

| ドメイン名          | IPアドレス    |
| ------------------- | ------------- |
| χητηολλψ.fy | 192.168.22.81 |
| ιτηεα.fy       | 192.168.22.82 |
| νεπηρεν.fy   | 192.168.22.83 |
| ρηαντολκ.fy | 192.168.22.84 |
| νοπητ.fy       | 192.168.22.85 |
| τιατ.fy         | 192.168.22.86 |

注意事項

セキュリティ周りの設定を無効化せずに解決すること。ただし、トラブルシューティングの間、検証目的での無効化は行っても良い。

達成すべき事項

192.168.22.70 をリゾルバに設定したPCからドメインを引き、ブラウザ上でそのドメイン名が書いてあるページを開くことができる。

解説

Punycode問題です。

国際化ドメイン名をPunycodeに変換していないままレコードを登録したため、レコードを引けないという状態になっています。
解決するには各ドメイン名をPunycodeに置き換える必要があります。

変換方法はlibidnなどのパッケージに含まれるidnコマンドを使用する方法もありますが、Punycodeでググると変換を行ってくれるWebサイトが引っかかるので、そちらで変換しても問題ありません。

変換を行うと以下のようになります。

χητηολλψ.fy → xn--sxaamas2ato.fy
ιτηεα.fy → xn--mxahfh9c.fy
νεπηρεν.fy → xn--qxaafwdpi.fy
ρηαντολκ.fy → xn--mxalkdjmk1a.fy
νοπητ.fy → xn--sxalgev.fy
τιατ.fy → xn--mxap6ac.fy

後はこれに合わせてzoneファイルを書き換えればいいです。
また、Slaveにも変更を適応させるため、SOAレコードのインクリメントも行います。

最後にDNSSECの再署名を行います。
鍵ファイルは/etc/nsd/内に、Kfy.+007+40373といった名前で二種類置いてありましたが、ファイルの中身を見ればZSK、KSKのどちらの鍵ファイルか分かるようになっていました。

鍵ファイルの中身はこのようになっています。(当日の問題で使用されていたファイル名と内容とは若干違いがあります)
(zsk)(ksk) という記載があり、ここで判別できます。

$ cat Kexample.com.+007+15443.key
example.com. IN DNSKEY 256 3 7 AwEAAdPhQCgp0125MKKcYGwQMjUg9H12gk70eZDoLHDYYR25nEQ5rTY296E9+9sl91Q6QmbAz5XA9lWwB+oJYGU1+DZA6S3c4ZxAz8ib1yuiWOmKCGiT+xIunULcMEMKP05eDddOf+6kouxazSFMmRjlB4CwWfxWnWGG1aevwOuMoK3H ;{id = 15443 (zsk), size = 1024b}

$ cat Kexample.com.+007+12753.key
example.com. IN DNSKEY 257 3 7 AwEAAdvhV55tAUr/CgnxSGw+Zfaj+OxxKiUskreYqrImF4YIHCpAGxBQgisC1MsaAxXz6gY8IZdtnOdf7+XOo2If4H1wnvwAIBuf7/Jw2z2qVAso6u1ok4xGDcUxA1WAnmqFWAGyEEEAQITnqT2gGN5TBN/UeM4WagcC8efuYXZJRm81oMhCg8jS/0U62VEu0HZb3fjauBVXBV7wug02SlohwVe2+JrdY9U59O5FdxOeGU1WWYYwpSCOnYUAG6ijWIv2KjPfK4o0B+Mn+jECwk9pvrHg7HwnP7cwNidWqRLzO49KklakhcwSrjMEoPYcsfZ7O/j/RxBKqv4NqsuanMoDxGE= ;{id = 12753 (ksk), size = 2048b}

署名を行うコマンドは以下のとおりです。
署名を行うと、 fy.zone.signed ファイルが再生成されます。

sudo ldns-signzone fy.zone $ZSK $KSK

ちなみに、解答してくれたチームはどのチームもPunycodeへの変換部分までは解答してくれていましたが、DNSSECの再署名まで行っているチームは2チームだけでした。